home *** CD-ROM | disk | FTP | other *** search
/ Sprite 1984 - 1993 / Sprite 1984 - 1993.iso / src / lib / c / sync / ds3100.md / Sync_GetLock.s < prev    next >
Text File  |  1989-07-08  |  3KB  |  91 lines

  1. /*
  2.  * Sync_GetLock.s --
  3.  *
  4.  *    Source code for the Sync_GetLock library procedure.
  5.  *
  6.  * Copyright (C) 1989 by Digital Equipment Corporation, Maynard MA
  7.  *
  8.  *            All Rights Reserved
  9.  *
  10.  * Permission to use, copy, modify, and distribute this software and its 
  11.  * documentation for any purpose and without fee is hereby granted, 
  12.  * provided that the above copyright notice appear in all copies and that
  13.  * both that copyright notice and this permission notice appear in 
  14.  * supporting documentation, and that the name of Digital not be
  15.  * used in advertising or publicity pertaining to distribution of the
  16.  * software without specific, written prior permission.  
  17.  *
  18.  * Digitial disclaims all warranties with regard to this software, including
  19.  * all implied warranties of merchantability and fitness.  In no event shall
  20.  * Digital be liable for any special, indirect or consequential damages or
  21.  * any damages whatsoever resulting from loss of use, data or profits,
  22.  * whether in an action of contract, negligence or other tortious action,
  23.  * arising out of or in connection with the use or performance of this
  24.  * software.
  25.  *
  26.  * Header: Sync_GetLock.s,v 1.1 88/06/19 14:34:17 ouster Exp $ SPRITE (DECWRL)
  27.  */
  28.  
  29. #ifdef KERNEL
  30. #include <regdef.h>
  31. #include "machConst.h"
  32. #else
  33. #include <regdef.h>
  34. #include "kernel/machConst.h"
  35. #endif
  36.  
  37.  
  38. /*
  39.  * ----------------------------------------------------------------------------
  40.  *
  41.  * Sync_GetLock --
  42.  *
  43.  *    Acquire a lock.  Other processes trying to acquire the lock
  44.  *    will block until this lock is released.
  45.  *
  46.  *      A critical section of code is protected by a lock.  To safely
  47.  *      execute the code, the caller must first call Sync_GetLock to
  48.  *      acquire the lock on the critical section.  At the end of the
  49.  *      critical section the caller has to call Sync_Unlock to release
  50.  *      the lock and allow other processes to execute in the critical
  51.  *      section.
  52.  *
  53.  * Results:
  54.  *    None.
  55.  *
  56.  * Side effects:
  57.  *      The lock is set.  Other processes will be blocked if they try
  58.  *      to lock the same lock.  A blocked process will try to get the
  59.  *      lock after this process unlocks the lock with Sync_Unlock.
  60.  *
  61.  * C equivalent:
  62.  *
  63.  *    void
  64.  *    Sync_GetLock(lockPtr)
  65.  *       Sync_Lock *lockPtr;
  66.  *    {
  67.  *        if (Sun_TestAndSet(&(lockPtr->inUse)) != 0) {
  68.  *        Sync_SlowLock(lockPtr); 
  69.  *        }
  70.  *    }
  71.  *
  72.  *----------------------------------------------------------------------
  73.  */
  74.     .globl Sync_GetLock
  75. Sync_GetLock:
  76. #ifdef KERNEL
  77.     mfc0    t0, MACH_COP_0_STATUS_REG
  78.     mtc0    zero, MACH_COP_0_STATUS_REG    # Disable interrupts
  79.     lw        t1, 0(a0)            # Read out old value
  80.     li        t2, 1
  81.     sw        t2, 0(a0)            # Set value.
  82.     mtc0    t0, MACH_COP_0_STATUS_REG    # Restore interrupts.
  83.     beq        t1, zero, 1f            # If not set then return
  84.     j        Sync_SlowLock            # Missed on the lock.
  85. 1:  j        ra
  86. #else
  87.     li        t0, 1
  88.     sw        t0, 0(a0)
  89.     j        ra
  90. #endif
  91.